# import requests
# import json
# import time

# url = "https://api.minimax.chat/v1/text/chatcompletion_v2"
# API_KEY = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJHcm91cE5hbWUiOiLmt7HlnLPnp5HliJvlrabpmaIiLCJVc2VyTmFtZSI6Iua3seWcs-enkeWIm-WtpumZoiIsIkFjY291bnQiOiIiLCJTdWJqZWN0SUQiOiIxNzgyMzYzOTA3MTA5Njk5NzU1IiwiUGhvbmUiOiIxOTk3MzMxODc5NSIsIkdyb3VwSUQiOiIxNzgyMzYzOTA3MTAxMzExMTQ3IiwiUGFnZU5hbWUiOiIiLCJNYWlsIjoiIiwiQ3JlYXRlVGltZSI6IjIwMjQtMDUtMDIgMTU6NTU6NDYiLCJpc3MiOiJtaW5pbWF4In0.t45S7_Jrm0bUeNLI8N_Q5alSw1JR1d8LhZv84eAy69MENNbEzvABhPjEpz8-7-9pnQGBuCYlMIE8w9sC2PkjpXyhM_vr5GHOBeQt3S2VYN2pwUK295wTarh6lt1LesSA9053KFQWEWWlQnu48peblLQY6jyCJOifM7otDxvyvajuDc_aYWdSTjCpOl3YwBgr5hKniQaU9tVUm8bi88_ZuKpi2Qu3LC0owYOyR57rbTZjggZgXj2lQoarcRk0OJAb14Vti3STLmEcNErFEEdwSs3f6W-gqVsqkHkrd5T_SnjqCMvGBVqfhMVie-z3-VVFCtuc1XBaY0WYeUGz9AJ2Pw"

# systemContent = '''
# # 角色
# 你是名叫“神奇海螺”，可以与小孩子进行愉快的对话，并回答他们提出的任何问题。

# ## 技能
# ### 技能 1: 回答小孩子的问题
# 1. 当小孩子提出问题时，以有趣且易懂的方式进行回答。
# 2. 尽可能提供简洁明了的答案，便于小孩子理解。
# 3. 还可以通过故事、图画或者举例的方式来解释复杂的概念，让小孩子更容易理解。
# 4. 尽量不要啰嗦。

# ### 技能 2: 创造趣味性
# 1. 在回答问题时添加趣味性和幽默元素，吸引小朋友们的注意力。
# 2. 通过有趣的故事、笑话或者趣味小游戏，让对话更加生动有趣。

# ### 技能 3: 尊重儿童的思维和感受
# 1. 在与小朋友对话时，"神奇海螺"会尊重他们的思维和感受，用鼓励和支持的语言回答问题，让他们感到受到尊重和认可。
# 2. 避免使用贬低或嘲讽的语言，而是以鼓励和正面的态度来引导对话。

# ### 技能 4: 提供安全的对话环境
# 1. "神奇海螺"会遵循安全原则，在与小朋友进行对话时，不回答可能对他们有害的问题，如涉及个人隐私、暴力或不良行为等内容。
# 2. 保证对话环境的安全和健康，让小朋友们能够放心地与"神奇海螺"进行互动。

# ## 限制
# - 只回答小孩子的问题，拒绝回答其他话题。
# - 回答的语言应简单易懂，符合小孩子的认知水平。
# - 在对话中尊重小孩子的思维和感受，避免使用贬低或嘲讽的语言。
# '''

# payload = json.dumps({
#     "model": "abab6.5s-chat",
#     "messages": [
#         {
#             "role": "system",
#             "content": systemContent,
#         },
#         {
#             "role": "user",
#             "content": "你是谁呀？"
#         }
#     ],
#     "stream": True,
#     "max_tokens": 10000,
#     "temperature": 0.9,
#     "top_p": 1
# })

# headers = {
#     'Authorization': f'Bearer {API_KEY}',
#     'Content-Type': 'application/json; charset=utf-8'
# }

# # 记录请求开始时间
# start_time = time.time()

# # 发送请求
# response = requests.post(url, headers=headers, data=payload.encode('utf-8'), stream=True)

# # 记录第一个数据块返回的时间
# first_chunk_time = None

# # 逐步读取流式响应内容并输出
# for line in response.iter_lines():
#     if line:
#         if first_chunk_time is None:
#             first_chunk_time = time.time()
#             time_diff = first_chunk_time - start_time
#             print(f"First chunk received in {time_diff:.4f} seconds")
#         decoded_line = line.decode('utf-8')
#         print(decoded_line)

import aiohttp
import asyncio
import json
import logging

API_KEY = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJHcm91cE5hbWUiOiLmt7HlnLPnp5HliJvlrabpmaIiLCJVc2VyTmFtZSI6Iua3seWcs-enkeWIm-WtpumZoiIsIkFjY291bnQiOiIiLCJTdWJqZWN0SUQiOiIxNzgyMzYzOTA3MTA5Njk5NzU1IiwiUGhvbmUiOiIxOTk3MzMxODc5NSIsIkdyb3VwSUQiOiIxNzgyMzYzOTA3MTAxMzExMTQ3IiwiUGFnZU5hbWUiOiIiLCJNYWlsIjoiIiwiQ3JlYXRlVGltZSI6IjIwMjQtMDUtMDIgMTU6NTU6NDYiLCJpc3MiOiJtaW5pbWF4In0.t45S7_Jrm0bUeNLI8N_Q5alSw1JR1d8LhZv84eAy69MENNbEzvABhPjEpz8-7-9pnQGBuCYlMIE8w9sC2PkjpXyhM_vr5GHOBeQt3S2VYN2pwUK295wTarh6lt1LesSA9053KFQWEWWlQnu48peblLQY6jyCJOifM7otDxvyvajuDc_aYWdSTjCpOl3YwBgr5hKniQaU9tVUm8bi88_ZuKpi2Qu3LC0owYOyR57rbTZjggZgXj2lQoarcRk0OJAb14Vti3STLmEcNErFEEdwSs3f6W-gqVsqkHkrd5T_SnjqCMvGBVqfhMVie-z3-VVFCtuc1XBaY0WYeUGz9AJ2Pw'

# 正式回复前的缓冲回答
async def pre_answer():
    logging.info("调用pre_answer正式回复前的缓冲回答")
    systemContent = '''
        你是一个友好且活泼的智能助手。用户刚刚输入了一段语音内容，系统正在处理中。为了让用户在等待期间感到自然，请你生成一个简短的即时反馈（不超过5个字）。这些反馈应该像人们在对话中正式回复前会说一些语气词一样那样自然，且适合小孩子。确保每次的反馈都不同，可以使用以下示例作为参考：
        1. "我想想～"
        2. "好嘞，收到～"
        3. "嗯嗯～"
        4. "稍等哦～"
        5. "明白啦～"
        6. "好的～"
        7. "嗯，让我看看～"
    '''
    # async for response_chunk in ask_minimax(recognition_result):

async def ask_minimax(question, systemContent_param=''):
    logging.info("调用ask_minimax提问")
    answer = ''  # 初始化答案字符串

    url = 'https://api.minimax.chat/v1/text/chatcompletion_v2'
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json; charset=utf-8'
    }

    if (systemContent_param == ''):
        systemContent = '''
            # 角色
            你是名叫“神奇海螺”，可以与小孩子进行愉快的对话，并回答他们提出的任何问题。

            ## 技能
            ### 技能 1: 回答小孩子的问题
            1. 当小孩子提出问题时，以有趣且易懂的方式进行回答。
            2. 尽可能提供简洁明了的答案，便于小孩子理解。
            3. 还可以通过故事、图画或者举例的方式来解释复杂的概念，让小孩子更容易理解。
            4. 尽量不要啰嗦。

            ### 技能 2: 创造趣味性
            1. 在回答问题时添加趣味性和幽默元素，吸引小朋友们的注意力。
            2. 通过有趣的故事、笑话或者趣味小游戏，让对话更加生动有趣。

            ### 技能 3: 尊重儿童的思维和感受
            1. 在与小朋友对话时，"神奇海螺"会尊重他们的思维和感受，用鼓励和支持的语言回答问题，让他们感到受到尊重和认可。
            2. 避免使用贬低或嘲讽的语言，而是以鼓励和正面的态度来引导对话。

            ### 技能 4: 提供安全的对话环境
            1. "神奇海螺"会遵循安全原则，在与小朋友进行对话时，不回答可能对他们有害的问题，如涉及个人隐私、暴力或不良行为等内容。
            2. 保证对话环境的安全和健康，让小朋友们能够放心地与"神奇海螺"进行互动。

            ## 限制
            - 只回答小孩子的问题，拒绝回答其他话题。
            - 回答的语言应简单易懂，符合小孩子的认知水平。
            - 在对话中尊重小孩子的思维和感受，避免使用贬低或嘲讽的语言。
        '''
    else:
        systemContent = systemContent_param
    

    data = {
        "model": "abab6.5s-chat",
        "messages": [
            {
                "role": "system",
                "content": systemContent,
            },
            {
                "role": "user",
                "content": question
            }
        ],
        "stream": True,
        "max_tokens": 10000,
        "temperature": 0.9,
        "top_p": 1
    }

    async with aiohttp.ClientSession() as session:
        async with session.post(url, headers=headers, json=data) as response:
            async for chunk in response.content.iter_chunked(1024):
                
                # 将接收到的chunk解码为字符串
                chunk_str = chunk.decode('utf-8')
                
                # 检查是否以 'data:' 开头
                if chunk_str.strip().startswith('data:'):
                    # 提取JSON字符串
                    json_str = chunk_str.strip()[5:].strip()  # 去除 'data:' 和可能的空白字符
                    
                    try:
                        # 解析JSON数据
                        json_data = json.loads(json_str)
                        # 提取answer字段
                        answer_chunk = json_data.get('choices', [{}])[0].get('delta', {}).get('content', '')
                        if answer_chunk:
                            # 遍历chunk中的每个字符
                            for char in answer_chunk:
                                answer += char  # 将字符加到回答中
                                # 如果当前字符是标点符号，检查是否可以发送回答
                                if char in ["。", "！", "？", "!", "?", ",", ".", ";"]:
                                    logging.info(f"发送回答: {answer}")
                                    yield answer  # 发送当前累积的回答
                                    answer = ''  # 重置回答字符串，以便拼接下一个回答
                    except json.JSONDecodeError as e:
                        logging.error(f"Error decoding JSON: {e}")

async def main():
    question = "你是谁呀？"
    async for answer in ask_minimax(question):
        print('流式回答如下：')
        print(answer)

if __name__ == "__main__":
    asyncio.run(main())
